package cn.schoolwow.quickdao.module.database.ddl.query.kit;

import cn.schoolwow.quickdao.domain.database.ddl.IndexField;
import cn.schoolwow.quickdao.domain.entity.Entity;
import cn.schoolwow.quickdao.domain.entity.Property;
import cn.schoolwow.quickdao.domain.entity.common.TableColumn;

import java.util.List;

/**
 * 数据定义语言-查询接口
 */
public interface DatabaseDefinitionQuery {
    /**
     * 表是否存在
     *
     * @param clazz 实体类
     */
    boolean hasTable(Class clazz);

    /**
     * 表是否存在
     *
     * @param tableName 表名
     */
    boolean hasTable(String tableName);

    /**
     * 列是否存在
     *
     * @param clazz 实体类
     * @param columnName 列名
     */
    boolean hasColumn(Class clazz, String columnName);

    /**
     * 列是否存在
     *
     * @param tableName  表名
     * @param columnName 列名
     */
    boolean hasColumn(String tableName, String columnName);

    /**
     * 获取数据库所有表名
     */
    List<String> getTableNameList();

    /**
     * 获取数据库表列表
     */
    List<Entity> getDatabaseEntityList();

    /**
     * 获取数据库表列表
     *
     * @param tableName 表名
     */
    Entity getDatabaseEntity(String tableName);

    /**
     * 获取表字段列表
     *
     * @param clazz 实体类
     */
    List<Property> getPropertyList(Class clazz);

    /**
     * 获取表字段列表
     *
     * @param tableName 表名
     */
    List<Property> getPropertyList(String tableName);

    /**
     * 获取表字段列表
     *
     * @param tableName 表名
     */
    List<TableColumn> getTableColumnList(String tableName);

    /**
     * 获取表字段
     *
     * @param clazz      实体类
     * @param columnName 字段名称
     */
    Property getProperty(Class clazz, String columnName);

    /**
     * 获取表指定字段
     *
     * @param tableName  表名
     * @param columnName 字段名称
     */
    Property getProperty(String tableName, String columnName);

    /**
     * 索引是否存在
     *
     * @param tableName 表名
     * @param indexName 索引名称
     */
    boolean hasIndex(String tableName, String indexName);

    /**
     * 约束否存在
     *
     * @param tableName      表名
     * @param constraintName 约束名称
     */
    boolean hasConstraint(String tableName, String constraintName);

    /**
     * 获取索引列表
     *
     * @param tableName 表名
     */
    List<IndexField> getIndexFieldList(String tableName);

    /**
     * 获取指定索引
     *
     * @param tableName 表名
     */
    IndexField getIndexField(String tableName, String indexName);

}
